home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / graphic / frasr182.zip / FPU087.ASM < prev    next >
Assembly Source File  |  1992-12-19  |  39KB  |  1,538 lines

  1. TITLE fpu087.asm (C) 1989, Mark C. Peterson, CompuServe [70441,3353]
  2. SUBTTL All rights reserved.
  3. ;
  4. ;  Code may be used in any program provided the author is credited
  5. ;    either during program execution or in the documentation.  Source
  6. ;    code may be distributed only in combination with public domain or
  7. ;    shareware source code.  Source code may be modified provided the
  8. ;    copyright notice and this message is left unchanged and all
  9. ;    modifications are clearly documented.
  10. ;
  11. ;    I would appreciate a copy of any work which incorporates this code.
  12. ;
  13. ;    Mark C. Peterson
  14. ;    405-C Queen St., Suite #181
  15. ;    Southington, CT 06489
  16. ;    (203) 276-9721
  17. ;
  18. ;  References:
  19. ;     The VNR Concise Encyclopedia of Mathematics
  20. ;        by W. Gellert, H. Hustner, M. Hellwich, and H. Kastner
  21. ;        Published by Van Nostrand Reinhold Comp, 1975
  22. ;
  23. ;     80386/80286 Assembly Language Programming
  24. ;        by William H. Murray, III and Chris H. Pappas
  25. ;        Published by Osborne McGraw-Hill, 1986
  26. ;
  27. ;  History since Fractint 16.3:
  28. ;     CJLT changed e2x and Log086 algorithms for more speed
  29. ;     CJLT corrected SinCos086 for -ve angles in 2nd and 4th quadrants
  30. ;     CJLT speeded up SinCos086 for angles >45 degrees in any quadrant
  31. ;     (See comments containing the string `CJLT')
  32. ; 14 Aug 91 CJLT removed r16Mul - not called from anywhere
  33. ; 21 Aug 91 CJLT corrected Table[1] from 6 to b
  34. ;                improved bx factors in Log086 for more accuracy
  35. ;                corrected Exp086 overflow detection to 15 from 16 bits.
  36. ; 07 Sep 92 MP   corrected problem in FPUcplxlog
  37. ; 07 Sep 92 MP   added argument test for FPUcplxdiv
  38. ; 06 Nov 92 CAE  made some varibles public for PARSERA.ASM
  39. ; 07 Dec 92 CAE  sped up FPUsinhcosh function
  40. ;
  41. ; CJLT=      Chris J Lusby Taylor
  42. ;            32 Turnpike Road
  43. ;            Newbury, England (where's that?)
  44. ;        Contactable via Compuserve user Stan Chelchowski [100016,351]
  45. ;                     or Tel 011 44 635 33270 (home)
  46. ;
  47. ; CAE=   Chuck Ebbert  CompuServe [76306,1226]
  48. ;
  49. ;
  50. ;PROCs in this module:
  51. ;FPUcplxmul     PROC     x:word, y:word, z:word
  52. ;FPUcplxdiv     PROC     x:word, y:word, z:word
  53. ;FPUcplxlog     PROC     x:word, z:word
  54. ;FPUsinhcosh    PROC     x:word, sinh:word, cosh:word
  55. ;FPUsincos  PROC  x:word, sinx:word, cosx:word
  56. ;r16Mul     PROC    uses si di, x1:word, x2:word, y1:word, y2:word
  57. ;RegFloat2Fg     PROC    x1:word, x2:word, Fudge:word
  58. ;RegFg2Float     PROC   x1:word, x2:word, FudgeFact:byte
  59. ;ExpFudged      PROC    uses si, x_low:word, x_high:word, Fudge:word
  60. ;LogFudged      PROC    uses si di, x_low:word, x_high:word, Fudge:word
  61. ;LogFloat14     PROC     x1:word, x2:word
  62. ;RegSftFloat     PROC   x1:word, x2:word, Shift:byte
  63. ;RegDivFloat     PROC  uses si di, x1:word, x2:word, y1:word, y2:word
  64. ;SinCos086   PROC     uses si di, LoNum:WORD, HiNum:WORD, SinAddr:WORD, \
  65. ;_e2xLT   PROC        ;argument in dx.ax (bitshift=16 is hard coded here)
  66. ;Exp086    PROC     uses si di, LoNum:WORD, HiNum:WORD
  67. ;SinhCosh086    PROC     uses si di, LoNum:WORD, HiNum:WORD, SinhAddr:WORD, \
  68. ;Log086   PROC     uses si di, LoNum:WORD, HiNum:WORD, Fudge:WORD
  69.  
  70.  
  71. IFDEF ??version
  72. MASM51
  73. QUIRKS
  74. ENDIF
  75.  
  76. .model medium, c
  77.  
  78. extrn cos:far
  79. extrn _Loaded387sincos:far
  80. extrn compiled_by_turboc:word
  81.  
  82.  
  83. .data
  84.  
  85. extrn cpu:WORD
  86.  
  87. PUBLIC TrigLimit, TrigOverflow
  88.  
  89. ; CAE 6Nov92 made these public for PARSERA.ASM */
  90. PUBLIC _1_, _2_, PointFive, infinity
  91.  
  92. PiFg13         dw       6487h
  93. InvPiFg33      dd       0a2f9836eh
  94. InvPiFg16      dw       517ch
  95. Ln2Fg16        dw       0b172h ;ln(2) * 2^16 . True value is b172.18
  96. Ln2Fg15        dw       058b9h ;used by e2xLT. True value is 58b9.0C
  97. TrigOverflow   dw       0
  98. TrigLimit      dd       0
  99. ;
  100. ;Table of 2^(n/16) for n=0 to 15. All entries fg15.
  101. ;Used by e2xLT
  102. ;
  103. Table        dw    08000h,085abh,08b96h,091c4h
  104.         dw    09838h,09ef5h,0a5ffh,0ad58h
  105.         dw    0b505h,0bd09h,0c567h,0ce25h
  106.         dw    0d745h,0e0cdh,0eac1h,0f525h
  107. one            dw       ?
  108. expSign        dw       ?
  109. a              dw       ?
  110. SinNeg         dw       ?    ;CJLT - not now needed by SinCos086, but by
  111. CosNeg           dw    ?    ;       ArcTan086
  112. Ans           dq    ?
  113. fake_es        dw       ?         ; <BDT> Windows can't use ES for storage
  114.  
  115. TaylorTerm  MACRO
  116. LOCAL Ratio
  117.    add   Factorial, one
  118.    jnc   SHORT Ratio
  119.  
  120.    rcr   Factorial, 1
  121.    shr   Num, 1
  122.    shr   one, 1
  123.  
  124. Ratio:
  125.    mul   Num
  126.    div   Factorial
  127. ENDM
  128.  
  129.  
  130.  
  131. _4_         dq    4.0
  132. _2_         dq    2.0
  133. _1_         dq    1.0
  134. PointFive   dq    0.5
  135. temp        dq     ?
  136. Sign        dw     ?
  137.  
  138. extrn fpu:word
  139.  
  140. .code
  141.  
  142.  
  143. FPUcplxmul     PROC     x:word, y:word, z:word
  144.    mov   bx, x
  145.    fld   QWORD PTR [bx]       ; x.x
  146.    fld   QWORD PTR [bx+8]     ; x.y, x.x
  147.    mov   bx, y
  148.    fld   QWORD PTR [bx]       ; y.x, x.y, x.x
  149.    fld   QWORD PTR [bx+8]     ; y.y, y.x, x.y, x.x
  150.    mov   bx, z
  151.    fld   st                   ; y.y, y.y, y.x, x.y, x.x
  152.    fmul  st, st(3)            ; y.y*x.y, y.y. y.x, x.y, x.x
  153.    fld   st(2)                ; y.x, y.y*x.y, y.y, y.x, x.y, x.x
  154.    fmul  st, st(5)            ; y.x*x.x, y.y*x.y, y.y, y.x, x.y, x.x
  155.    fsubr                      ; y.x*x.x - y.y*x.y, y.y, y.x, x.y, x.x
  156.    fstp  QWORD PTR [bx]       ; y.y, y.x, x.y, x.x
  157.    fmulp st(3), st            ; y.x, x.y, x.x*y.y
  158.    fmul                       ; y.x*x.y, x.x*y.y
  159.    fadd                       ; y.x*x.y + x.x*y.y
  160.    fstp  QWORD PTR [bx+8]
  161.    ret
  162. FPUcplxmul     ENDP
  163.  
  164.  
  165. .DATA
  166.  
  167. infinity          dq    1.0E+300
  168.  
  169. PUBLIC DivideOverflow
  170. DivideOverflow    dw    0
  171.  
  172. .CODE
  173.  
  174.  
  175. FPUcplxdiv     PROC     x:word, y:word, z:word
  176. LOCAL Status:WORD
  177.    mov   bx, x
  178.    fld   QWORD PTR [bx]       ; x.x
  179.    fld   QWORD PTR [bx+8]     ; x.y, x.x
  180.    mov   bx, y
  181.    fld   QWORD PTR [bx]       ; y.x, x.y, x.x
  182.    fld   QWORD PTR [bx+8]     ; y.y, y.x, x.y, x.x
  183.    fld   st                   ; y.y, y.y, y.x, x.y, x.x
  184.    fmul  st, st               ; y.y*y.y, y.y, y.x, x.y, x.x
  185.    fld   st(2)                ; y.x, y.y*y.y, y.y, y.x, x.y, x.x
  186.    fmul  st, st               ; y.x*y.x, y.y*y.y, y.y, y.x, x.y, x.x
  187.    fadd                       ; mod, y.y, y.x, x.y, x.x
  188.  
  189.    ftst                       ; test whether mod is (0,0)
  190.    fstsw Status
  191.    mov   ax, Status
  192.    and   ah, 01000101b
  193.    cmp   ah, 01000000b
  194.    jne   NotZero
  195.  
  196.    fstp  st
  197.    fstp  st
  198.    fstp  st
  199.    fstp  st
  200.    fstp  st
  201.  
  202.    fld   infinity
  203.    fld   st
  204.    mov   bx, z
  205.    fstp  QWORD PTR [bx]
  206.    fstp  QWORD PTR [bx+8]
  207.    inc   DivideOverflow
  208.    jmp   ExitDiv
  209.  
  210. NotZero:
  211.    fdiv  st(1), st            ; mod, y.y=y.y/mod, y.x, x.y, x.x
  212.    fdivp st(2), st            ; y.y, y.x=y.x/mod, x.y, x.x
  213.    mov   bx, z
  214.    fld   st                   ; y.y, y.y, y.x, x.y, x.x
  215.    fmul  st, st(3)            ; y.y*x.y, y.y. y.x, x.y, x.x
  216.    fld   st(2)                ; y.x, y.y*x.y, y.y, y.x, x.y, x.x
  217.    fmul  st, st(5)            ; y.x*x.x, y.y*x.y, y.y, y.x, x.y, x.x
  218.    fadd                       ; y.x*x.x - y.y*x.y, y.y, y.x, x.y, x.x
  219.    fstp  QWORD PTR [bx]       ; y.y, y.x, x.y, x.x
  220.    fmulp st(3), st            ; y.x, x.y, x.x*y.y
  221.    fmul                       ; y.x*x.y, x.x*y.y
  222.    fsubr                      ; y.x*x.y + x.x*y.y
  223.    fstp  QWORD PTR [bx+8]
  224.  
  225. ExitDiv:
  226.    ret
  227. FPUcplxdiv     ENDP
  228.  
  229.  
  230.  
  231. FPUcplxlog     PROC     x:word, z:word
  232. LOCAL Status:word, ImagZero:WORD
  233.    mov   bx, x
  234.  
  235.    mov   ax, WORD PTR [bx+8+6]
  236.    mov   ImagZero, ax
  237.    or    ax, WORD PTR [bx+6]
  238.    jnz   NotBothZero
  239.  
  240.    fldz
  241.    fldz
  242.    jmp   StoreZX
  243.  
  244. NotBothZero:
  245.    fld   QWORD PTR [bx+8]        ; x.y
  246.    fld   QWORD PTR [bx]          ; x.x, x.y
  247.    mov   bx, z
  248.    fldln2                        ; ln2, x.x, x.y
  249.    fdiv  _2_                     ; ln2/2, x.x, x.y
  250.    fld   st(2)                   ; x.y, ln2/2, x.x, x.y
  251.    fmul  st, st                  ; sqr(x.y), ln2/2, x.x, x.y
  252.    fld   st(2)                   ; x.x, sqr(x.y), ln2/2, x.x, x.y
  253.    fmul  st, st                  ; sqr(x.x), sqr(x.y), ln2/2, x.x, x.y
  254.    fadd                          ; mod, ln2/2, x.x, x.y
  255.    fyl2x                         ; z.x, x.x, x.y
  256.    fxch  st(2)                   ; x.y, x.x, z.x
  257.